package com.demo.java.OD351_400.OD360;

import java.util.Scanner;
import java.util.Stack;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【可以组成网络的服务器(B卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146165724
 */
public class OdMain {
    // 使用DFS找到连通区域
    public static int find(int[][] grid, int i, int j) {
        int count = 0;
        Stack<int[]> stk = new Stack<>(); // 使用栈来模拟DFS
        stk.push(new int[]{i, j});

        // DFS遍历
        while (!stk.isEmpty()) {
            int[] pos = stk.pop();
            int x = pos[0];
            int y = pos[1];

            // 检查当前点是否有效
            if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] == 0) {
                continue;
            }

            // 标记该点为已访问
            grid[x][y] = 0; // 将该位置标记为已访问
            count++;

            // 将四个方向的相邻点加入栈中
            stk.push(new int[]{x + 1, y}); // 下
            stk.push(new int[]{x - 1, y}); // 上
            stk.push(new int[]{x, y + 1}); // 右
            stk.push(new int[]{x, y - 1}); // 左
        }

        return count; // 返回连通区域的大小
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 网格的行数
        int m = scanner.nextInt(); // 网格的列数

        int[][] grid = new int[n][m];
        // 读取网格数据
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                grid[i][j] = scanner.nextInt();
            }
        }

        int maxSize = 0; // 最大连通区域的大小
        // 遍历整个网格
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                // 如果当前点是服务器且未被访问过，进行DFS
                if (grid[i][j] == 1) {
                    maxSize = Math.max(maxSize, find(grid, i, j)); // 更新最大连通区域大小
                }
            }
        }

        System.out.println(maxSize); // 输出最大连通区域的大小
    }
}